package com.work.daily.stream;

import com.work.daily.stream.data.Person;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * Stream 的收集(collect)
 * collect，收集，可以说是内容最繁多、功能最丰富的部分了。从字面上去理解，就是把一个流收集起来，
 * 最终可以是收集成一个值也可以收集成一个新的集合。
 *
 * @author Shengkang.Mo
 * @create 2020-11-27 16:20
 * 分组(partitioningBy/groupingBy)
 * 分区：将stream按条件分为两个Map，比如员工按薪资是否高于8000分为两部分。
 * 分组：将集合分为多个Map，比如员工按性别分组。有单级分组和多级分组。
 */
public class Stream_7_3 {
    public static void main(String[] args) {
        List<Person> personList = Person.initData();

        //将员工按薪资是否高于8000分为两部分
        Map<Boolean, List<Person>> part = personList.stream().collect(Collectors.partitioningBy(x -> x.getSalary() > 8000));
        System.out.println("按8000工资分组：" + part);

        //将员工按性别
        Map<String, List<Person>> group = personList.stream().collect(Collectors.groupingBy(Person::getSex));
        System.out.println("按照性别分组：" + group);
        System.out.println("female="+ group.get("female").size());
        System.out.println("male="+ group.get("male").size());

        //将员工按性别和地区分组
        Map<String, Map<String, List<Person>>> group2 = personList.stream()
                .collect(Collectors.groupingBy(Person::getSex, Collectors.groupingBy(Person::getArea)));
        System.out.println("先按性别再按地区分组：" + group2);
    }
}
